# https://blog.csdn.net/qdPython/article/details/115550281
import struct
import binascii

"""
struct——将字节解释为被打包的二进制数据
	此模块在Python 值和表示为 Python 字节对象的 C 结构之间进行转换。
	一些struct函数（struct方法）使用缓冲区参数
"""

# Packing（打包）
# 在本例中，格式指定器(specifier)需要一个整型或长整型，一个两个字节的string,和一个浮点数。格式符中的空格用于分隔各个指示器(indicators)，在编译格式时会被忽略。
values = (1, "ab".encode("utf-8"), 2.7)
s = struct.Struct("I 2s f")
packed_data = s.pack(*values)

print('原始值:', values)
print('格式符:', s.format)
print('占用字节:', s.size)
print('打包结果:', binascii.hexlify(packed_data))

# Unpacking（解包）
# 这个示例将打包的值转换为十六进制字节序列，用binascii.hexlify()方法打印出来。
packed_data = binascii.unhexlify(b'0100000061620000cdcc2c40')

s = struct.Struct('I 2s f')
unpacked_data = s.unpack(packed_data)
print('解包结果:', unpacked_data)  # 将打包的值传给unpack()，基本上返回相同的值(浮点数会有差异)。

endianness = [
	('@', 'native, native'),
	('=', 'native, standard'),
	('<', 'little-endian'),
	('>', 'big-endian'),
	('!', 'network'),
]

for code, name in endianness:
	s = struct.Struct(code + ' I 2s f')
	packed_data = s.pack(*values)
	print()
	print('格式符  : ', s.format, 'for', name)
	print('占用字节: ', s.size)
	print('打包结果: ', binascii.hexlify(packed_data))
	print('解包结果: ', s.unpack(packed_data))
